#pragma once

#include <json/json.h>

namespace response {
    enum class StatusCode {
        // 通用
        Success = 0, // 成功
        InternalServerError = 100, // 服务器内部错误
        ServiceUnavailable = 101, // 服务不可用

        // 用户相关 1000-1999
        UserExists = 1000, // 用户已存在
        UserDoesNotExist = 1001, // 用户不存在
        InvalidUserCredentials = 1002, // 用户凭证无效
        UserLockedOut = 1003, // 用户被锁定
        UserNotVerified = 1004, // 用户未验证
        PasswordResetRequired = 1005, // 需要重置密码
        WrongPassword = 1006, // 密码错误
        // 在这里添加更多的用户相关的状态代码

        // 权限相关 2000-2999
        Unauthorized = 2000, // 未授权
        PermissionDenied = 2001, // 权限不足
        TokenExpired = 2002, // 令牌过期
        TokenInvalid = 2003, // 令牌无效
        // 在这里添加更多的权限相关的状态代码

        // 参数相关 3000-3999
        InvalidParameters = 3000, // 参数无效
        MissingParameters = 3001, // 缺少参数
        ParameterOutOfRange = 3002, // 参数超出范围
        // 在这里添加更多的参数相关的状态代码

        // 数据相关 4000-4999
        DataNotFound = 4000, // 数据未找到
        DataAlreadyExists = 4001, // 数据已存在
        DataConflict = 4002, // 数据冲突
        // 在这里添加更多的数据相关的状态代码

        // 网络相关 5000-5999
        NetworkError = 5000, // 网络错误
        Timeout = 5001, // 超时
        ConnectionLost = 5002, // 连接丢失
        // 在这里添加更多的网络相关的状态代码
    };

    class Response : public Json::Value {
    public:
        Response(const std::string &msg, response::StatusCode code, const Json::Value &data);

        [[nodiscard]] std::string getMsg() const;

        void setMsg(const std::string &msg);

        [[nodiscard]] StatusCode getCode() const;

        void setCode(StatusCode code);

        [[nodiscard]]  Value getData() const;

        void setData(const Value &data);
    };

    class SuccessResponse : public Response {
    public:
        explicit SuccessResponse(const Json::Value &data = Json::nullValue);
    };

    class ErrorResponse : public Response {
    public:
        ErrorResponse(const std::string &msg, response::StatusCode code);
    };

    class UserExistsResponse : public Response {
    public:
        explicit UserExistsResponse(const Json::Value &data = Json::nullValue);
    };

    class UserDoesNotExistResponse : public Response {
    public:
        explicit UserDoesNotExistResponse(const Json::Value &data = Json::nullValue);
    };

    class WrongPasswordResponse : public Response {
    public:
        explicit WrongPasswordResponse(const Json::Value &data = Json::nullValue);
    };

    class InvalidParametersResponse : public Response {
    public:
        explicit InvalidParametersResponse(const Json::Value &data = Json::nullValue);
    };
}